package ru.romannep.pc.chopperbattle;





///**
// * Заправочная станция. Ничем не отличается кроме своего типа от обычного
// * игрового элемента
// */
//class FuelStation extends GameElement {
//
//    public FuelStation(float x, float y, float sx, float sy) {
//        super(GameElementTypes.FUEL_STATION, x, y, sx, sy, GameEngine.BORDER_ELAST);
//    }
//}

/**
 * Вертолет. Имеет ориентацию (право-лево), количество выпущенных пуль, горючее
 *
 */
public class GameChopper extends MovingGameElement {

    private ChopperBattleGameEngine ge;
    public int bulletsCount;
    public boolean directionRight, inGame;
    public float fuel;

    GameChopper(ChopperBattleGameEngine ge, float x, float y, boolean direction) {
        super(GameElementTypes.CHOPPER, x, y, ChopperBattleGameEngine.CHOPPER_SIZE_X, ChopperBattleGameEngine.CHOPPER_SIZE_Y, 0, 0, 0, 0, ChopperBattleGameEngine.ACC_GRAVITY);
        this.ge = ge;
        directionRight = direction;
        bulletsCount = 0;
        fuel = ChopperBattleGameEngine.FUEL_CAPACITY;
    }

    /**
     * Инициализирует вертолет значениями по умолчанию. С такими значениями
     * вертолет пребывает вне игры.
     */
    void reset() {
        x = ChopperBattleGameEngine.FIELD_SIZE_X;
        y = ChopperBattleGameEngine.FIELD_SIZE_Y;
        speedX = 0;
        speedY = 0;
        accX = 0;
        accY = ChopperBattleGameEngine.ACC_GRAVITY;
        inGame = false;
        fuel = ChopperBattleGameEngine.FUEL_CAPACITY;
        bulletsCount = 0;
    }

    /**
     * Синхронизирует поля с другим объектом.
     */
    void synchronize(GameChopper chopper){
        inGame = chopper.inGame;
        
        x = chopper.x;
        y = chopper.y;
        speedX = chopper.speedX;
        speedY = chopper.speedY;
        accX = chopper.accX;
        accY = chopper.accY;
        directionRight = chopper.directionRight;
        
        bulletsCount = chopper.bulletsCount;
        fuel = chopper.fuel;
        
    }
    
    /**
     * Изменяет скорость вертолета, в соответствии с игровыми ограничениями:
     * -скорость вертолета ограничена по осям -при отсутствии горючего у
     * вертолета пропадает тяга
     */
    @Override
    public void changeSpeed() {

        fuel -= ChopperBattleGameEngine.FUEL_USE_IDLE;
        if (accX != 0) {
            fuel -= ChopperBattleGameEngine.FUEL_USE_ENGINE;
        }
        if (accY != ChopperBattleGameEngine.ACC_GRAVITY) {
            fuel -= ChopperBattleGameEngine.FUEL_USE_ENGINE;
        }

        if (fuel <= 0) {
            accX = 0;
            accY = ChopperBattleGameEngine.ACC_GRAVITY;
        }

        speedX += accX;
        speedY += accY;

        speedX = speedX > ChopperBattleGameEngine.MAX_SPEED ? ChopperBattleGameEngine.MAX_SPEED : speedX;
        speedY = speedY > ChopperBattleGameEngine.MAX_SPEED ? ChopperBattleGameEngine.MAX_SPEED : speedY;
        speedX = speedX < -ChopperBattleGameEngine.MAX_SPEED ? -ChopperBattleGameEngine.MAX_SPEED : speedX;
        speedY = speedY < -ChopperBattleGameEngine.MAX_SPEED ? -ChopperBattleGameEngine.MAX_SPEED : speedY;


    }

    /**
     * Проверяет включен ли у вертолета двигатель - есть ли тяга
     *
     * @return true если двигатель включен
     */
    public boolean engineOn() {
        return (accX != 0) || (accY != ChopperBattleGameEngine.ACC_GRAVITY);
    }

    /**
     * Обрабатывает команду - тяга лево-право-верх или выстрел
     *
     * @param command
     */
    void processCommands(GameChopperCommand command) {

        switch (command) {
            case UP_ON:
                accY = ChopperBattleGameEngine.ACC_GRAVITY - ChopperBattleGameEngine.ACC_CHOPPER_Y;
                break;
            case UP_OFF:
                accY = ChopperBattleGameEngine.ACC_GRAVITY;
                break;
            case LEFT_ON:
                directionRight = false;
                accX = -ChopperBattleGameEngine.ACC_CHOPPER_X;
                break;
            case LEFT_OFF:
                if (!directionRight) {
                    accX = 0;
                }
                break;
            case RIGHT_ON:
                directionRight = true;
                accX = ChopperBattleGameEngine.ACC_CHOPPER_X;
                break;
            case RIGHT_OFF:
                if (directionRight) {
                    accX = 0;
                }
                break;
            case FIRE:
                if (bulletsCount < ChopperBattleGameEngine.MAX_BULLETS_COUNT) {

                    GameBullet bullet = new GameBullet(this, directionRight ? x + sx * (1.1f) : x - ChopperBattleGameEngine.BULLET_SIZE - sx * 0.1f, y + sy / 2, directionRight ? (ChopperBattleGameEngine.MAX_SPEED * 1.1f) : -(ChopperBattleGameEngine.MAX_SPEED * 1.1f), speedY);
                    //GameBullet bullet = new GameBullet(this, directionRight ? x + sx* (1.1f)  : x - GameEngine.BULLET_SIZE - sx * 0.1f, y + sy / 2, directionRight ? (GameEngine.MAX_SPEED ) : -(GameEngine.MAX_SPEED ), speedY);

                    ge.addBullet(bullet, this);
                    bulletsCount++;
                }
        }

    }

    /**
     * При попадании в вертолет пули - убиваем вертолет
     *
     * @param obj
     * @param contactEdge
     */
    @Override
    protected void incomingContact(GameElement obj, ContactEdge contactEdge) {
        if (obj.type == GameElementTypes.BULLET) {
            ge.destroyChopper(this);
        }
// бывало, что вертолет стукался о собственную пулю :)
//        if ((obj.type == GameElementTypes.BULLET) && (!((GameBullet) obj).chopper.equals(this))) {
//            ge.destroyChopper(this);
//        }
    }

    /**
     * При столкновении проверяем - уничтожен ли вертолет, если нет - возвращаем
     * true для отражения (отскока) Вертолет может быть уничтожен если:
     * -наткнулся на пулю -стукнулся о препядствие со слишком большой скоростью
     * Если коснулись заправочной станции - добавляется горючее в бак
     *
     * @param obj
     * @param contactEdge
     * @return
     */
    @Override
    protected boolean onContact(GameElement obj, ContactEdge contactEdge) {

        //если вдруг об пулю стукнулся вертолет
        if (obj.type == GameElementTypes.BULLET) {
            ge.destroyChopper(this);
            return false;
        }

        //если слишком большоая скорость
        if (((contactEdge == ContactEdge.CONTACT_LEFT || contactEdge == ContactEdge.CONTACT_RIGHT) && (Math.abs(speedX) > ChopperBattleGameEngine.CHOPPER_CRITICAL_SPEED))
                || ((contactEdge == ContactEdge.CONTACT_TOP || contactEdge == ContactEdge.CONTACT_BOTTOM) && (Math.abs(speedY) > ChopperBattleGameEngine.CHOPPER_CRITICAL_SPEED))) {
            ge.destroyChopper(this);
            return false;
        }

        //заправка
        if (obj.type == GameElementTypes.FUEL_STATION) {
            fuel += ChopperBattleGameEngine.FUEL_FILL;
            fuel = fuel > ChopperBattleGameEngine.FUEL_CAPACITY ? ChopperBattleGameEngine.FUEL_CAPACITY : fuel;
        }

        return true;
    }

    public void destroyBullet(GameBullet bullet) {
        bulletsCount--;
    }
}

